      1  import java.io.File;

      2  import java.io.IOException;

      3  import java.util.Scanner;

      4

      5  /**

      6     Reads a data set from a file. The file must have the format

      7     numberOfValues

      8     value1

      9     value2

     10     . . .

     11  */

     12  public class DataSetReader

     13  {

     14     private double[] data;

     15

     16     /**

     17        Reads a data set.

     18        @param filename the name of the file holding the data

     19        @return the data in the file

     20     */

     21     public double[] readFile(String filename) throws IOException

     22     {

     23        File inFile = new File(filename);

     24        Scanner in = new Scanner(inFile);

     25        try

     26        {

     27           readData(in);

     28           return data;

     29        }

     30        finally

     31        {

     32           in.close();

     33        }

     34     }

     35

     36     /**

     37        Reads all data.

     38        @param in the scanner that scans the data

     39     */

     40     private void readData(Scanner in) throws BadDataException

     41     {

     42        if (!in.hasNextInt())

     43        {

     44           throw new BadDataException("Length expected");

     45        }

     46        int numberOfValues = in.nextInt();

     47        data = new double[numberOfValues];

     48

     49        for (int i = 0; i < numberOfValues; i++)

     50        {

     51           readValue(in, i);

     52        }

     53

     54        if (in.hasNext())

     55        {

     56           throw new BadDataException("End of file expected");

     57        }

     58     }

     59

     60     /**

     61        Reads one data value.

     62        @param in the scanner that scans the data

     63        @param i the position of the value to read

     64     */

     65     private void readValue(Scanner in, int i) throws BadDataException

     66     {

     67        if (!in.hasNextDouble())

     68        {

     69           throw new BadDataException("Data value expected");

     70        }

     71        data[i] = in.nextDouble();

     72     }

     73  }